package com.example.ocrappspringboot01.config;

import net.sourceforge.tess4j.Tesseract;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.ClassPathResource;


import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;

@Configuration
public class OcrConfig {
    //训练文件路径设置为磁盘绝对路径
    @Value("${tess4j.datapath}")
    private String dataPath;

    //训练文件路径设置为当前项目的根目录
    @Value("${tess4j.rootpath}")
    private String rootpath;

    @Bean
    public Tesseract tesseract() throws IOException {

        Tesseract tesseract = new Tesseract();
        // 使用ClassPathResource加载模型文件
        ClassPathResource resource = new ClassPathResource("tessdata/chi_sim.traineddata");

        // 将模型文件解压到临时目录
        Path tempDir = Files.createTempDirectory("tessdata");
        File modelFile = extractResourceToTemp(resource, tempDir);


        // 设置训练数据文件夹路径
        tesseract.setDatapath(tempDir.toAbsolutePath().toString());
        // 设置为中文简体
        tesseract.setLanguage("chi_sim");
        return tesseract;
    }

    /**
     * 将类路径资源解压到临时目录
     *
     * @param resource 类路径资源
     * @param tempDir  临时目录
     * @return 解压后的文件
     * @throws IOException 如果解压失败
     */
    private File extractResourceToTemp(ClassPathResource resource, Path tempDir) throws IOException {
        if (!Files.exists(tempDir)) {
            Files.createDirectories(tempDir);
        }

        // 目标文件路径
        File targetFile = new File(tempDir.toFile(), "chi_sim.traineddata");

        // 将资源文件复制到临时目录
        try (InputStream in = resource.getInputStream()) {
            Files.copy(in, targetFile.toPath(), StandardCopyOption.REPLACE_EXISTING);
        }

        return targetFile;
    }
}
